<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<!-- <script>
    var global = 1;
    function outer(){
        var outer_local = 2;
        function inner(){
            var inner_local = 3;
            return inner_local + outer_local + global;
        }
        return inner();
    }
    console.log(outer());
</script> -->

<!-- 3.5.2.1 闭包 -->
<script>
    var a = 'global varable';
    var F = function(){
        var b = 'local variable';
        var N = function (){
            var c = 'inner local';
            return b;
        }
        return N;
    }
    var inner = F();
    console.log(inner());
    //local variable;

    // 函数N有自己的私有空间，同时也可以访问f()的空间和全局变量，所以b对他来说是可见的，因为f()是可以在全局空间内被调用的（他是一个全局函数），所以我们可以将它的返回值赋值给另一个全局变量，从而产生一个可以访问f()私有变量的新全局函数；

    // 因为inner()是F()函数返回的他本身的局部变量，所以inner()可以访问f()的局部变量；
</script>

<!-- 3.5.2.2 闭包 -->
<script type="text/javascript">
    var inner;
    var F = function(){
        var b = 'local variable';
        var N = function(){
            return b;
        }
        inner = N;
    }
    console.log(inner());
    //local variable;

    // 我们在函数F内定义了一个新的函数N，虽然N是局部变量，但是把他赋值给了全局变量inner，所以全局变量inner也有了读取函数F内部局部变量的能力
</script>

<!-- 3.5.2.2 闭包 -->
<script type="text/javascript">
    function F(param){
        var N = function(){
            return param;
        }
        param++;
        return N;
    }

    var inner = F(123);
    console.log(inner());
    // 124

    // 由此可以看出函数绑定的是作用域本身，而不是在函数定义时该作用域中的变量或变量当前所返回的值。
</script>
</body>
</html>
